home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / hardware / camedia / camedia.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  34KB  |  1,562 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #include <dos/dos.h>
  7. #include <exec/exec.h>
  8. #include <devices/serial.h>
  9.  
  10. #include <clib/exec_protos.h>
  11. #include <clib/dos_protos.h>
  12. #include <clib/alib_protos.h>
  13.  
  14. #include <pragma/dos_lib.h>
  15. #include <pragma/exec_lib.h>
  16.  
  17. #include "Camedia.h"
  18.  
  19. struct MsgPort  *SerialMP=NULL;
  20. struct MsgPort  *TimerMP=NULL;
  21. struct IOExtSer *SerialIO=NULL;
  22. struct timerequest *TimerIO=NULL;
  23.  
  24. ULONG WaitMask;
  25. int get_preview=0;
  26. int first_Packet=1;
  27. char error_msg_buffer[256];
  28.  
  29. void clean(int entrypoint) {
  30.     switch(entrypoint) {
  31.         case 100:
  32.         case 101:
  33.             if (TimerIO) {
  34.                CloseDevice((struct IORequest *) TimerIO);
  35.            }
  36.         case 102:
  37.             if (SerialIO) {
  38.                 CloseDevice((struct IORequest *) SerialIO);
  39.             }
  40.         case 103:
  41.             if (TimerIO) {
  42.                 DeleteExtIO((struct IORequest *) TimerIO);
  43.                 TimerIO=NULL;
  44.             }
  45.         case 104:
  46.             if (SerialIO) {
  47.                 DeleteExtIO((struct IORequest *) SerialIO);
  48.                 SerialIO=NULL;
  49.             }
  50.         case 105:
  51.             if (TimerMP) {
  52.                 DeletePort(TimerMP);
  53.                 TimerMP=NULL;
  54.             }
  55.         case 106:
  56.             if (SerialMP) {
  57.                 DeletePort(SerialMP);
  58.                 SerialMP=NULL;
  59.             }
  60.     };
  61. }
  62.  
  63.  
  64. void bootstrap(char *serial_device, int unit, char* error_msg) {
  65.     SerialMP=CreatePort(0,0);
  66.     if (!SerialMP) {
  67.         strcpy(error_msg, "Couldn't do CreateMsgPort() for SerialMP");
  68.         return;
  69.     }
  70.     
  71.     TimerMP=CreatePort(0,0);
  72.     if (!SerialMP) {
  73.         clean(106);
  74.         strcpy(error_msg, "Couldn't do CreateMsgPort() for TimerMP");
  75.         return;
  76.     }
  77.     
  78.     if (!(SerialIO = (struct IOExtSer *) CreateExtIO(SerialMP, sizeof(struct IOExtSer)))) {
  79.         clean(105);
  80.         strcpy(error_msg, "Couldn't do CreateExtIO() for SerialIO");
  81.         return;
  82.     }
  83.     
  84.     if (!(TimerIO = (struct timerequest *) CreateExtIO(TimerMP, sizeof(struct timerequest)))) {
  85.         clean(104);
  86.         strcpy(error_msg, "Couldn't do CreateExtIO() for TimerIO");
  87.         return;
  88.     }
  89.     
  90.     if (OpenDevice(serial_device, (ULONG) unit, (struct IORequest *) SerialIO, 0)) {
  91.         sprintf(error_msg_buffer, "Error, couldn't open %s, unit %d", serial_device, unit);
  92.         clean(103);
  93.         strcpy(error_msg, error_msg_buffer);
  94.         return;
  95.     }
  96.     
  97.     SerialIO->io_RBufLen=2060;
  98.     SerialIO->io_SerFlags &=SERF_XDISABLED | SERF_RAD_BOOGIE;
  99.     SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  100.     if (DoIO((struct IORequest *)SerialIO)) {
  101.         sprintf(error_msg_buffer, "Error, couldn't set the read buffer from %s, unit %d to 2060 bytes", serial_device, unit);
  102.         clean(103);
  103.         strcpy(error_msg, error_msg_buffer);
  104.         return;
  105.     }
  106.     
  107.     
  108.     if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *) TimerIO, 0L)) {
  109.         clean(102);
  110.         strcpy(error_msg, "Error, couldn't open timer device");
  111.         return;
  112.     }
  113.  
  114.     WaitMask=SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F| 1L<<SerialMP->mp_SigBit | 1L<<TimerMP->mp_SigBit;
  115. }
  116.  
  117. void SetSerialSpeed(enum Camera_Speed cam_speed, char* error_msg ) {
  118.     long computer_speed;
  119.     
  120.     switch(cam_speed) {
  121.         case CAMERA_SPEED_9600:
  122.             computer_speed=9600;
  123.             break;
  124.             
  125.         case CAMERA_SPEED_19200:
  126.         case CAMERA_SPEED_INIT:
  127.             computer_speed=19200;
  128.             break;
  129.             
  130.         case CAMERA_SPEED_38400:
  131.             computer_speed=38400;
  132.             break;
  133.             
  134.         case CAMERA_SPEED_57600:
  135.             computer_speed=57600;
  136.             break;
  137.             
  138.         case CAMERA_SPEED_115200:
  139.             computer_speed=115200;
  140.             break;
  141.         
  142.         default:
  143.             strcpy(error_msg, "Unknown Camera speed");
  144.             return;
  145.     }
  146.     
  147.     SerialIO->io_Baud=computer_speed;
  148.     SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  149.     if (DoIO((struct IORequest *)SerialIO)) strcpy(error_msg, "Error in SetSerialSpeed");
  150. }
  151.  
  152. void init(enum Camera_Speed cs, char* error_msg ) {
  153.     L1 r;
  154.     int retry=0;
  155.  
  156.     while (retry<MAX_RETRIES) {
  157.  
  158.         SetSerialSpeed(CAMERA_SPEED_INIT, error_msg);
  159.         if (*error_msg!=0) goto init_catch;
  160.         // check speed
  161.         send_L1(Computer_Initialization_Byte, error_msg);
  162.         if (*error_msg!=0) goto init_catch;
  163.         
  164.         read_L1(&r, error_msg);
  165.         if (*error_msg!=0) goto init_catch;
  166.         if (r==Camera_Signature) {
  167.             Set_Comm_Speed(cs, error_msg);
  168.             if (*error_msg!=0) goto init_catch;
  169.             return;
  170.         }                
  171.     
  172.     init_catch:
  173.         printf("got error in init: %s\n", error_msg);
  174.         retry++;
  175.         Delay(200);
  176.     }
  177.     strcpy(error_msg, "Couldn't do init");
  178. }
  179.  
  180.  
  181. void send(L1 *cb, long length, char* error_msg) {
  182.     ULONG result;
  183.     
  184.     SerialIO->IOSer.io_Length  = length;
  185.     SerialIO->IOSer.io_Data    = (APTR) cb;
  186.     SerialIO->IOSer.io_Command = CMD_WRITE;
  187.     
  188.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  189.     TimerIO->tr_time.tv_secs=TIMEOUT;
  190.     TimerIO->tr_time.tv_micro=0;
  191.     
  192.     #ifdef comm_debug
  193.         printf("Will send %d bytes:\n", length);
  194.         print_bytes(cb, length);
  195.     #endif
  196.     
  197.     SendIO((struct IORequest *) TimerIO);
  198.     SendIO((struct IORequest *) SerialIO);
  199.     while (1) {
  200.         result=Wait(WaitMask);
  201.         if (CheckIO((struct IORequest *) SerialIO) ) {
  202.             WaitIO((struct IORequest *) SerialIO);
  203.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  204.             WaitIO((struct IORequest *) TimerIO);
  205.             #ifdef comm_debug
  206.                 printf("Send was ok\n\n");
  207.             #endif
  208.             return;
  209.         }
  210.         if (CheckIO((struct IORequest *) TimerIO) ) {
  211.             // Timeout
  212.             WaitIO((struct IORequest *) TimerIO);
  213.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  214.             WaitIO((struct IORequest *) SerialIO);
  215.             strcpy(error_msg, "timeout error");
  216.             return;
  217.         }
  218.         if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
  219.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  220.             WaitIO((struct IORequest *) SerialIO);
  221.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  222.             WaitIO((struct IORequest *) TimerIO);
  223.             strcpy(error_msg, "User sent CTRL_C or F");
  224.             return;
  225.         }
  226.     }
  227. }
  228.  
  229. __inline void send_L1(L1 b, char* error_msg) {
  230.     send(&b,1, error_msg);
  231. }
  232.  
  233. __inline void send_L2(L2 s, char* error_msg) {
  234.     L2 n;
  235.     
  236.     n=SetL2(s);
  237.     send((L1 *) &n, 2, error_msg);
  238. }
  239.  
  240. void read(L1 *cb, long max_size, char* error_msg) {
  241.     ULONG result;
  242.  
  243.     #ifdef comm_debug
  244.        printf("Would like to receive %d bytes\n", max_size);
  245.     #endif
  246.    
  247.     SerialIO->IOSer.io_Length  = max_size;
  248.     SerialIO->IOSer.io_Data    = (APTR) cb;
  249.     SerialIO->IOSer.io_Command = CMD_READ;
  250.  
  251.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  252.     TimerIO->tr_time.tv_secs=TIMEOUT;
  253.     TimerIO->tr_time.tv_micro=0;
  254.  
  255.     SendIO((struct IORequest *) TimerIO);
  256.     SendIO((struct IORequest *) SerialIO);
  257.     
  258.     while (1) {
  259.         result=Wait(WaitMask);
  260.         if (CheckIO((struct IORequest *)SerialIO)) {
  261.             WaitIO((struct IORequest *) SerialIO);
  262.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  263.             WaitIO((struct IORequest *) TimerIO);
  264.             
  265.             #ifdef comm_debug
  266.                 printf("Received %d bytes:\n", SerialIO->IOSer.io_Actual);
  267.                 print_bytes(cb, SerialIO->IOSer.io_Actual);
  268.                 printf("\n");
  269.             #endif
  270.             
  271.             if (SerialIO->IOSer.io_Actual!=max_size) {
  272.                 strcpy(error_msg, "Couldn't read enough");
  273.                 return;
  274.             }            
  275.             return;
  276.         }
  277.         
  278.         if (CheckIO((struct IORequest *) TimerIO) ){
  279.             // Timeout
  280.             WaitIO((struct IORequest *) TimerIO);
  281.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  282.             WaitIO((struct IORequest *) SerialIO);
  283.             strcpy(error_msg, "timeout error");
  284.             return;
  285.         }
  286.          
  287.         if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
  288.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  289.             WaitIO((struct IORequest *) SerialIO);
  290.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  291.             WaitIO((struct IORequest *) TimerIO);
  292.             strcpy(error_msg, "User sent CTRL_C or F");
  293.             return;
  294.         }
  295.     }
  296. }
  297.  
  298. __inline void read_L1(L1 *v, char* error_msg) {
  299.     read(v, 1, error_msg);
  300.  
  301. __inline void read_L2(L2 *v, char* error_msg) {
  302.     read((L1 *) v, 2, error_msg);
  303.     *v=SetL2(*v);
  304. }
  305.  
  306. __inline void read_L4(L4 *v, char* error_msg) {
  307.     read((L1 *) v, 4, error_msg);
  308.     *v=SetL4(*v);
  309. }
  310.  
  311. __inline L2 checksum(L1 *start, L1 *end) {
  312.     L1 *i; L2 cs=0;
  313.     for (i=start; i<end; i++)
  314.         cs=cs+(L1) *i;
  315.  
  316.     return (L2) (cs &0xffff);
  317. }
  318.  
  319.  
  320. void SetIntegerRegister(enum Command_0 Register, L4 Value, char* error_msg) {
  321.         struct Command_0_Packet cmd;
  322.         L1 v; 
  323.           int retries;
  324.  
  325.         cmd.Packet_type=Packet_Command;
  326.            if (first_Packet) {
  327.                    cmd.Packet_subtype=Packet_Subtype_First_Command;
  328.                first_Packet=0;
  329.         }
  330.            else {
  331.                    cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  332.         }
  333.           cmd.Length_of_data=SetL2(6);
  334.         cmd.Command_Code=0;
  335.         cmd.Register_Number=Register;
  336.           cmd.NewValue=SetL4(Value);
  337.         cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
  338.  
  339.         #ifdef debug
  340.               print_bytes((L1 *)&cmd, sizeof(struct Command_0_Packet));
  341.           #endif
  342.  
  343.          retries=0;
  344.           while (retries<MAX_RETRIES) {
  345.                 send((L1 *) &cmd, sizeof(struct Command_0_Packet), error_msg);
  346.                 if (*error_msg!=0) return;
  347.                 read_L1(&v, error_msg);
  348.                 if (*error_msg!=0) return;
  349.                 if (v==Camera_Positive_Achnowledgement) return;
  350.                   else if (v==Camera_Unable_to_Execute_Command) retries++;
  351.                 else {
  352.                     strcpy(error_msg, "Got unexpected msg from camera");
  353.                     return;
  354.                 }
  355.           }
  356. }
  357.  
  358.  
  359. void ReadIntegerRegister(enum Command_1 Register, L4 *value, char* error_msg) {
  360.     struct Command_1_Packet cmd;
  361.     L2 cs, ccs;
  362.     int retries=0;
  363.     L1 bb[10];
  364.     L4 *L4b;
  365.     
  366.     cmd.Packet_type=Packet_Command;
  367.     if (first_Packet) {
  368.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  369.         first_Packet=0;
  370.     }
  371.     else {
  372.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  373.     }
  374.     
  375.     cmd.Length_of_data=0x0200;
  376.     cmd.Command_Code=0x01;
  377.     cmd.Register_Number=Register;
  378.     cmd.checksum=(Register+1)<<8;
  379.         
  380.     #ifdef debug
  381.         print_bytes((L1 *) &cmd, sizeof(struct Command_1_Packet));
  382.     #endif
  383.  
  384.     send((L1 *) &cmd, sizeof(struct Command_1_Packet), error_msg);
  385.     /* get packet */
  386.     while (retries<MAX_RETRIES) {
  387.         read(bb, 10, error_msg);
  388.         // check consistency;
  389.         
  390.         L4b=(L4 *) &bb[0];
  391.         if (*L4b!=0x03000400) {
  392.             strcpy(error_msg, "Got unexpected data from camera");
  393.             return;
  394.         }
  395.         
  396.         *value= (L4) ((bb[7]<<24) + (bb[6]<<16) + (bb[5]<<8) + bb[4]);
  397.         cs=(L2) ((bb[9]<<8) + bb[8]);
  398.         ccs=(L4) (bb[4]+bb[5]+bb[6]+bb[7]);
  399.         if (cs!=ccs) {
  400.             printf("Checksum (=%x) is not calculated checksum (=%x)\n", cs, ccs);
  401.             retries++;
  402.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  403.             if (*error_msg!=0) return;
  404.         } else {
  405.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  406.             return; // return anyway
  407.         }
  408.     }
  409.     strcpy(error_msg, "Retry Error in ReadIntegerRegister()");
  410. }
  411.  
  412.  
  413. void TakeAction(enum Action_Code action, L1 arg, char* error_msg) {
  414.           /* struct and in this case struct Command_2_Packet has a special behavior.
  415.            When declaring an element, which takes more then one single byte
  416.            like L2 or L4, the structure will set the offset to an even number.
  417.            Example:
  418.  
  419.                 Offset:
  420.                         struct Command_2_Packet {
  421.                 0            L1 Packet_type;
  422.                 1            L1 Packet_subtype;
  423.                 2            L2 Length_of_data;
  424.  
  425.                 4            L1 Command_Code;
  426.                 5            L1 Action_Code;
  427.                 6            L1 single_byte;
  428.  
  429.                 8            L2 checksum;
  430.                    }
  431.  
  432.              As You see, the offset 8 at checksum is an even address. So the
  433.           memory at offset 7 will not be used. 
  434.  
  435.           That is normaly no problem, as long as the structre is used in memory.
  436.           But in this case, the structre will be sent to the camera as a stream of
  437.           bytes. That means also the unused byte at offset 7 will be sent, which is
  438.           of course not part of the camera protocol. That's why I can't send it directly,
  439.              I have to send it in two parts (0..6 and 7..8).
  440.  
  441.              Why does the compiler this automatic offset changing? The reason is simple.
  442.           The 68000 family cpu (and mnay others too) can't access to odd addresses.
  443.           If You try, You will get an alert (=Guru message).
  444.         */
  445.  
  446.     struct Command_2_Packet cmd;
  447.     L1 bb[2]; L2 cs;
  448.  
  449.     cmd.Packet_type=Packet_Command;
  450.     if (first_Packet) {
  451.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  452.         first_Packet=0;
  453.    } else {
  454.        cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  455.    }
  456.  
  457.     cmd.Length_of_data=0x0300;
  458.     cmd.Command_Code=0x02;
  459.     cmd.Action_Code=action;
  460.     if (action==AC_Set_Protection_State && arg!=0) cmd.single_byte=1;
  461.     else cmd.single_byte=0;
  462.     //cs=checksum((L1 *) &(cmd.Command_Code), (L1 *) (&(cmd.single_byte)+1));
  463.     cs=(2+action+cmd.single_byte);
  464.  
  465.     send((L1 *) &cmd, sizeof(struct Command_2_Packet)-3, error_msg);
  466.     if (*error_msg!=0) return;
  467.     send_L2(cs, error_msg);
  468.     if (*error_msg!=0) return;
  469.  
  470.     read(bb, 2, error_msg);
  471.     if (*error_msg!=0) return;
  472.     if (bb[0]!=Camera_Positive_Achnowledgement) {
  473.         strcpy(error_msg, "Error in TakeAction, no Camera ACK");
  474.         return;
  475.     }
  476.     if (bb[1]!=Camara_Action_Complete_Notification)
  477.         strcpy(error_msg, "Error in TakeAction, no action complete notification");
  478.     return;
  479. }
  480.  
  481.  
  482. void ReadVDataRegister(enum Command_4 Register, L1 *ret, L4 *total_size, char* error_msg) {
  483.     struct Command_4_Packet cmd;
  484.     L1 *bb, local_seq_number=0;
  485.     L2 size, cs, ccs;
  486.     int retry;
  487.     L1 minibuffer[4];
  488.     
  489.     bb=ret;
  490.     *total_size=0;
  491.     
  492.     cmd.Packet_type=Packet_Command;
  493.     if (first_Packet) {
  494.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  495.         first_Packet=0;
  496.     }
  497.     else {
  498.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  499.     }
  500.     cmd.Length_of_data=0x0200;
  501.     cmd.Command_Code=4;
  502.     cmd.Register_Number=Register;
  503.     //cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
  504.     cmd.checksum=(4+Register)<<8;
  505.  
  506.     send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
  507.     if (*error_msg!=0) return;
  508.     
  509.     /* here, I should be able to receive one or many Data-Packages */
  510.     retry=0;
  511.     do {
  512.         read(minibuffer, 4, error_msg);
  513.         if (*error_msg!=0) return;
  514.         if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
  515.             strcpy(error_msg, "Got unexpected msg from camera in ReadVDataRegister()");
  516.             return;
  517.         }
  518.         
  519.         if (minibuffer[1]!=local_seq_number) {
  520.             strcpy(error_msg, "Packet seq doesn't match with internal seq");
  521.             return;
  522.         }
  523.  
  524.         size=(minibuffer[3]<<8) + minibuffer[2];
  525.         if (size>2048) {
  526.             strcpy(error_msg, "wrong size");
  527.             return;
  528.         }
  529.         if (retry==0) {
  530.             *total_size=*total_size+(L4) size;
  531.         }
  532.         read(bb, size+2, error_msg);
  533.         if (*error_msg!=0) return;
  534.         cs=(bb[size+1]<<8) + bb[size];
  535.         ccs=checksum((L1 *) bb, (L1 *) (bb+size));
  536.         if (cs!=ccs) {
  537.             printf("wrong checksum  (got=%x, calculated=%x)\n", cs, ccs);
  538.             retry++;
  539.         }
  540.         if (retry==0) {
  541.             /* send ACK */
  542.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  543.             if (*error_msg!=0) return;
  544.             if (minibuffer[0]==Packet_Last_in_Seq) return;
  545.             bb+=size;
  546.             local_seq_number++;
  547.         
  548.         } else {
  549.             /* send NAK */
  550.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  551.             if (*error_msg!=0) return;
  552.             retry=0;
  553.         }
  554.     } while (1);
  555. }
  556.  
  557. #ifdef comm_debug
  558.  
  559. void print_bytes(L1 *p, long len) {
  560.     long i, j, oldi;
  561.     
  562.     if (len<32) {
  563.         // print all
  564.         for (i=0;i<len;) {
  565.             oldi=i;
  566.             j=i+16;
  567.             if (j>len) j=len;
  568.             
  569.             for (;i<j;i++) {
  570.                 printf("%5d ", i);
  571.             }
  572.             printf("\n");
  573.             for (i=oldi;i<j;i++) {
  574.                 printf("%5x ", (int) p[i]);
  575.             }
  576.             printf("\n");
  577.         }
  578.         printf("\n\n");
  579.     } else {
  580.         // print two parts
  581.         
  582.         for (i=0;i<16;) {
  583.             oldi=i;
  584.             j=i+16;
  585.                         
  586.             for (;i<j;i++) {
  587.                 printf("%5d ", i);
  588.             }
  589.             printf("\n");
  590.             for (i=oldi;i<j;i++) {
  591.                 printf("%5x ", (int) p[i]);
  592.             }
  593.             printf("\n");
  594.         }
  595.         printf("\n");
  596.         
  597.         for (i=len-16;i<len;) {
  598.             oldi=i;
  599.             j=i+16;
  600.             if (j>len) j=len;
  601.             
  602.             for (;i<j;i++) {
  603.                 printf("%5d ", i);
  604.             }
  605.             printf("\n");
  606.             for (i=oldi;i<j;i++) {
  607.                 printf("%5x ", (int) p[i]);
  608.             }
  609.             printf("\n");
  610.         }
  611.         printf("\n\n");
  612.     }
  613. }
  614.  
  615. #endif
  616.  
  617. void save_Frame(int framenumber, char *name, char *comment, char* error_msg) {
  618.     BPTR file;
  619.     struct Command_4_Packet cmd;
  620.     L1 local_seq_number=0;
  621.     L2 size, cs, ccs;
  622.     int retry, not_all_read=1;
  623.     L1 minibuffer[4];
  624.     L1 buffer[2050];
  625.     
  626.     file=Open(name, MODE_NEWFILE);
  627.     if (file==NULL) {
  628.         strcpy(error_msg, "Couldn't open file");
  629.         return;
  630.     }
  631.     
  632.     SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
  633.     if (*error_msg!=0) {
  634.         Close(file);
  635.         DeleteFile(name);
  636.         return;
  637.     }
  638.     
  639.     // ask camera to send data
  640.  
  641.     cmd.Packet_type=Packet_Command;
  642.     if (first_Packet) {
  643.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  644.         first_Packet=0;
  645.     }
  646.     else {
  647.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  648.     }
  649.     cmd.Length_of_data=0x0200;
  650.     cmd.Command_Code=4;
  651.     cmd.Register_Number=Cmd_Get_Current_Frame;
  652.     cmd.checksum=(4+Cmd_Get_Current_Frame)<<8;
  653.  
  654.     send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
  655.     if (*error_msg!=0) {
  656.         printf("%s\n", error_msg);
  657.         Close(file);
  658.         DeleteFile(name);
  659.         strcpy(error_msg, "ReadVDRegister:Error during sending Packet");
  660.         return;
  661.     }
  662.  
  663.  
  664.     // read data and save them            
  665.     retry=0;
  666.     do {
  667.         // read a bit
  668.         read(minibuffer, 4, error_msg);
  669.         if (*error_msg!=0) {
  670.             Close(file);
  671.             DeleteFile(name);
  672.             return;
  673.         }
  674.  
  675.         if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
  676.             Close(file);
  677.             DeleteFile(name);
  678.             strcpy(error_msg, "Got unexpected msg from camera");
  679.             return;
  680.         }        
  681.         
  682.         if (minibuffer[1]!=local_seq_number) {
  683.             printf("Packet seq#=%d doesn't match with internal seq#%d\n", minibuffer[1], local_seq_number);
  684.             Close(file);
  685.             DeleteFile(name);
  686.             strcpy(error_msg, "Packet seq# doesn't match with internal seq#");
  687.             return;
  688.         }
  689.  
  690.         size=(minibuffer[3]<<8) + minibuffer[2];
  691.         if (size>2048) {
  692.             Close(file);
  693.             DeleteFile(name);
  694.             strcpy(error_msg, "wrong size (bigger then 2048");
  695.             return;
  696.         }
  697.         
  698.         read(buffer, size+2, error_msg);
  699.         if (*error_msg!=0) goto catch_save_Frame;
  700.         
  701.         cs=(buffer[size+1]<<8) + buffer[size];
  702.         ccs=checksum((L1 *) buffer, (L1 *) (buffer+size));
  703.         if (cs!=ccs) {
  704.             printf("wrong checksum  (got=%x, calculated=%x)\n", cs, ccs);
  705.             retry++;
  706.         }
  707.         if (retry==0) {
  708.             /* send ACK */
  709.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  710.             if (*error_msg!=0) goto catch_save_Frame;
  711.             if (minibuffer[0]==Packet_Last_in_Seq) not_all_read=0;
  712.             local_seq_number++;
  713.         
  714.         } else {
  715.             /* send NAK */
  716.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  717.             if (*error_msg!=0) goto catch_save_Frame;
  718.             retry=0;
  719.         }
  720.         goto skip_catch_save_Frame;
  721.     catch_save_Frame:
  722.         Close(file);
  723.         DeleteFile(name);
  724.         return;
  725.         
  726.     skip_catch_save_Frame:
  727.             
  728.         // save a bit    
  729.         if (-1==Write(file, (void *) buffer, size)) {
  730.             Close(file);
  731.             DeleteFile(name);
  732.             strcpy(error_msg, "Error during writing the file");
  733.             return;
  734.         }            
  735.     }
  736.     while (not_all_read!=0);
  737.     Close(file);
  738.     if (comment!=NULL) SetComment(name, comment);
  739.     return;
  740. }
  741.  
  742.  
  743. void save_Thumbnail(int framenumber, char *name, char *comment, char* error_msg) {
  744.  
  745.     long *size=0;
  746.     L1 buffer[4060];
  747.     BPTR file;
  748.     
  749.     
  750.     file=Open(name, MODE_NEWFILE);
  751.     if (file==NULL) {
  752.         strcpy(error_msg, "Couldn't open file");
  753.         return;
  754.     }
  755.         
  756.     SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
  757.     if (*error_msg!=0) {
  758.         Close(file);
  759.         DeleteFile(name);
  760.         return;
  761.     }
  762.  
  763.     ReadVDataRegister(Cmd_Get_Current_Thumbnail, (L1 *) buffer, (L4 *) size, error_msg);
  764.     if (*error_msg!=0) {
  765.         printf("%s\n", error_msg);
  766.         strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
  767.         return;
  768.     }
  769.     if (-1==Write(file, (void *) buffer, *size)) {
  770.         Close(file);
  771.         DeleteFile(name);
  772.         strcpy(error_msg, "Error during writing the file");
  773.         return;
  774.     }
  775.     Close(file);
  776.     if (comment!=NULL) SetComment(name, comment);
  777.     return;
  778. }
  779.  
  780.  
  781. void Set_Resolution(Resolution re, char* error_msg) {
  782.     int retries=0;
  783.     MACRO_Set_Integer(Cmd_Set_Resolution, (L4) re, error_msg);
  784. }
  785.  
  786.  
  787. void Set_Clock(time_t c, char* error_msg) {
  788.     int retries=0;
  789.     MACRO_Set_Integer(Cmd_Set_Clock, (L4) c, error_msg);
  790. }
  791.  
  792.  
  793. void Set_Shutter_Speed(long ss, char* error_msg) {
  794.     int retries=0;
  795.     MACRO_Set_Integer(Cmd_Set_Shutter_Speed, (L4) ss, error_msg);
  796. }
  797.  
  798.  
  799. void Set_Aperture(enum Aperture a, char* error_msg) {
  800.     int retries=0;
  801.     MACRO_Set_Integer(Cmd_Set_Aperture, (L4) a, error_msg);
  802. }
  803.  
  804.  
  805. void Set_Color_Mode(enum Color_Mode cm, char* error_msg) {
  806.     int retries=0;
  807.     MACRO_Set_Integer(Cmd_Set_Color_Mode, (L4) cm, error_msg);
  808. }
  809.  
  810.  
  811. void Set_Flash_Mode(enum Flash_Mode fm, char* error_msg) {
  812.     int retries=0;
  813.     MACRO_Set_Integer(Cmd_Set_Flash_Mode, (L4) fm, error_msg);
  814. }
  815.  
  816.  
  817. void Set_Comm_Speed(enum Camera_Speed cs, char* error_msg) {
  818.     SetIntegerRegister(Cmd_Set_Comm_Speed, (L4) cs, error_msg);
  819.     if (*error_msg!=0) return;
  820.     Delay(5); // wait 0.5 seconds so camera can prepare for the change
  821.     SetSerialSpeed(cs, error_msg);
  822. }
  823.  
  824.  
  825. void Set_Bright_And_Contrast(enum Bright_Contrast bc, char* error_msg) {
  826.     int retries=0;
  827.     MACRO_Set_Integer(Cmd_Set_Bright_And_Contrast, (L4) bc, error_msg);
  828. }
  829.  
  830.  
  831. void Set_White_Balance(enum White_Balance wb, char* error_msg) {
  832.     int retries=0;
  833.     MACRO_Set_Integer(Cmd_Set_White_Balance, (L4) wb, error_msg);
  834. }
  835.  
  836.  
  837. void Set_Autoshut_on_Host_Timer(int aoht, char* error_msg) {
  838.     int retries=0;
  839.     MACRO_Set_Integer(Cmd_Set_Autoshut_on_Host_Timer, (L4) aoht, error_msg);
  840. }
  841.  
  842.  
  843. void Set_Autoshut_on_Field_Timer(int asoft, char* error_msg) {
  844.     int retries=0;
  845.     MACRO_Set_Integer(Cmd_Set_Autoshut_on_Field_Timer, (L4) asoft, error_msg);
  846. }
  847.  
  848.  
  849. void Set_LED(enum LED_Mode lm, char* error_msg) {
  850.     int retries=0;
  851.     MACRO_Set_Integer(Cmd_Set_LED, (L4) lm, error_msg);
  852. }
  853.  
  854.  
  855. void Set_Lens_Mode(enum Lens_Mode lm, char* error_msg) {
  856.     int retries=0;
  857.     MACRO_Set_Integer(Cmd_Set_Lens_Mode, (L4) lm, error_msg);
  858. }
  859.  
  860.  
  861. void Set_Date_Format(enum Date_Format df, char* error_msg) {
  862.     int retries=0;
  863.     MACRO_Set_Integer(Cmd_Set_Date_Format, (L4) df, error_msg);
  864. }
  865.  
  866.  
  867. void Set_Exp_Meter(enum Exp_Meter em, char* error_msg) {
  868.     int retries=0;
  869.     MACRO_Set_Integer(Cmd_Set_Exp_Meter, (L4) em, error_msg);
  870. }
  871.  
  872.  
  873. void Set_Optical_Mode(int AEL_WBL, int Fisheye, int Wide, int Digital_Zoom, int BAW, char* error_msg) {
  874.     L4 r=0;
  875.     int retries=0;
  876.     
  877.     if (AEL_WBL) r+=0x1;
  878.     if (Fisheye) r+=0x2;
  879.     if (Wide) r+=0x4;
  880.     if (Digital_Zoom) r+=0x8;
  881.     if (BAW) {r+=0x10}
  882.     
  883.     MACRO_Set_Integer(Cmd_Set_Optical_Mode, (L4) r, error_msg);
  884. }
  885.  
  886.  
  887. void Get_Resolution(enum Resolution *re, char* error_msg) {
  888.     L4 r;
  889.     int retries=0;
  890.     
  891.     MACRO_Get_FI_Integer(Cmd_Get_Resolution, error_msg);
  892.     if (*error_msg!=0) return;
  893.  
  894.     switch (r) {
  895.         case Standard_Resolution:
  896.         case High_Resolution:
  897.         case Extended_Resolution:
  898.             *re=(Resolution) r;
  899.             return;
  900.         default:
  901.             *re=Unknown_Resolution;
  902.     }
  903. }
  904.  
  905.  
  906. void Get_Clock(time_t *c, char* error_msg) {
  907.     L4 r;
  908.     int retries=0;
  909.     
  910.     MACRO_Get_FI_Integer(Cmd_Get_Clock, error_msg);
  911.     *c=(time_t) r;
  912. }
  913.  
  914.  
  915. void Get_Shutter_Speed(long *ss, char* error_msg) {
  916.     L4 r;
  917.     int retries=0;
  918.     
  919.     MACRO_Get_FI_Integer(Cmd_Get_Shutter_Speed, error_msg);
  920.     *ss=(long) r;
  921. }
  922.  
  923.  
  924. void Get_Aperture(enum Aperture *a, char* error_msg) {
  925.     L4 r;
  926.     int retries=0;
  927.     
  928.     MACRO_Get_FI_Integer(Cmd_Get_Aperture, error_msg);
  929.  
  930.     switch (r) {
  931.         case Low_Aperture:
  932.         case Midium_Aperture:
  933.         case High_Aperture:
  934.             *a=(Aperture) r;
  935.             break;
  936.         default:
  937.             *a=Unknown_Aperture;
  938.     }
  939. }
  940.  
  941.  
  942. void Get_Color_Mode(enum Color_Mode *cm, char* error_msg) {
  943.     L4 r;
  944.     int retries=0;
  945.     
  946.     MACRO_Get_FI_Integer(Cmd_Get_Color_Mode, error_msg);
  947.  
  948.     switch (r) {
  949.         case Color_Color_Mode:
  950.         case BAW_Color_Mode:
  951.             *cm=(Color_Mode) r;
  952.             break;
  953.         default:
  954.             *cm=Unknown_Color_Mode;;
  955.     }
  956. }
  957.  
  958.  
  959. void Get_Flash_Mode(enum Flash_Mode *fm, char* error_msg) {
  960.     L4 r;
  961.     int retries=0;
  962.     
  963.     MACRO_Get_FI_Integer(Cmd_Get_Flash_Mode, error_msg);
  964.  
  965.     switch (r) {
  966.         case Auto_Flash_Mode:
  967.         case Force_Flash_Mode:
  968.         case Off_Flash_Mode:
  969.         case Anti_Red_Eye_Flash_Mode:
  970.         case Slow_Sync_Flash_Mode:
  971.             *fm=(Flash_Mode) r;
  972.             break;
  973.             
  974.         default:
  975.             *fm=Unknown_Flash_Mode;
  976.     }
  977. }
  978.  
  979.  
  980. void Get_Num_of_Frames_Taken(int *noft, char* error_msg) {
  981.     L4 r;
  982.     int retries=0;
  983.     
  984.     MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Taken, error_msg);
  985.     *noft=(int) r;
  986. }
  987.  
  988.  
  989. void Get_Num_of_Frames_Left(int *nofl, char* error_msg) {
  990.     L4 r;
  991.     int retries=0;
  992.     
  993.     MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Left, error_msg);
  994.     *nofl=(int) r;
  995. }
  996.  
  997.  
  998. void Get_Length_of_Frame(int framenumber, long *length, char* error_msg) {
  999.     L4 r;
  1000.     int retries=0;
  1001.     get_preview=0;
  1002.     
  1003.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Frame, error_msg);
  1004.     *length=(long) r;
  1005. }
  1006.  
  1007.  
  1008. void Get_Length_of_Thumbnail(int framenumber, long *length, char* error_msg) {
  1009.     L4 r;
  1010.     int retries=0;
  1011.     get_preview=0;
  1012.     
  1013.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Thumbnail, error_msg);
  1014.     *length=(long) r;
  1015. }
  1016.  
  1017.  
  1018. void Get_Battery_Capacity(int *bc, char* error_msg) {
  1019.     L4 r;
  1020.     int retries=0;
  1021.     
  1022.     MACRO_Get_FI_Integer(Cmd_Get_Battery_Capacity, error_msg);
  1023.     *bc=(int) r;
  1024. }
  1025.  
  1026.  
  1027. void Get_Comm_Speed(enum Camera_Speed *cs, char* error_msg) {
  1028.     L4 r;
  1029.     int retries=0;
  1030.     
  1031.     MACRO_Get_FI_Integer(Cmd_Get_Comm_Speed, error_msg);
  1032.  
  1033.     r=r& 0xff;
  1034.     switch(r) {
  1035.         case CAMERA_SPEED_9600:
  1036.         case CAMERA_SPEED_19200:
  1037.         case CAMERA_SPEED_38400:
  1038.         case CAMERA_SPEED_57600:
  1039.         case CAMERA_SPEED_115200:
  1040.             *cs=(Camera_Speed) r;
  1041.             break;
  1042.         default:
  1043.             *cs=CAMERA_SPEED_Unknown;
  1044.     }
  1045. }
  1046.  
  1047.  
  1048. void Get_Bright_And_Contrast(enum Bright_Contrast *bc, char* error_msg) {
  1049.     L4 r;
  1050.     int retries=0;
  1051.     
  1052.     MACRO_Get_FI_Integer(Cmd_Get_Bright_And_Contrast, error_msg);
  1053.  
  1054.     switch(r) {
  1055.         case Normal_Bright_Contrast:
  1056.         case More_Bright_Bright_Contrast:
  1057.         case Less_Bright_Bright_Contrast:
  1058.         case More_Contrast_Bright_Contrast:
  1059.         case Less_Contrast_Bright_Contrast:
  1060.             *bc=(Bright_Contrast) r;
  1061.             break;
  1062.         
  1063.         default:
  1064.             *bc=Unknown_Bright_Contrast;
  1065.             break;
  1066.     }
  1067. }
  1068.  
  1069.  
  1070. void Get_White_Balance(enum White_Balance *wb, char* error_msg) {
  1071.     L4 r;
  1072.     int retries=0;
  1073.     
  1074.     MACRO_Get_FI_Integer(Cmd_Get_White_Balance, error_msg);
  1075.     
  1076.     switch(r) {
  1077.         case Auto_White_Balance:
  1078.         case Skylight_White_Balance:
  1079.         case Fluoresent_White_Balance:
  1080.         case Thungsten_White_Balance:
  1081.         case Cloudy_White_Balance:
  1082.             *wb=(White_Balance) r;
  1083.             break;
  1084.         
  1085.         default:
  1086.             *wb=Unknown_White_Balance;
  1087.             break;
  1088.     }
  1089. }
  1090.  
  1091.  
  1092. void Get_Autoshut_on_Host_Timer(int *asoht, char* error_msg) {
  1093.     L4 r;
  1094.     int retries=0;
  1095.     
  1096.     MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
  1097.     *asoht=(int) r;
  1098. }
  1099.  
  1100.  
  1101. void Get_Autoshut_on_Field_Timer(int *asoft, char* error_msg) {
  1102.     L4 r;
  1103.     int retries=0;
  1104.     
  1105.     MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
  1106.     *asoft=(int) r;
  1107. }
  1108.  
  1109.  
  1110. void Get_Available_Memory_Left(long *aml, char* error_msg) {
  1111.     L4 r;
  1112.     int retries=0;
  1113.     
  1114.     MACRO_Get_FI_Integer(Cmd_Get_Available_Memory_Left, error_msg);
  1115.     *aml=(int) r;
  1116. }
  1117.  
  1118.  
  1119. void Get_Lens_Mode(enum Lens_Mode *lm, char* error_msg) {
  1120.     L4 r;
  1121.     int retries=0;
  1122.  
  1123.     MACRO_Get_FI_Integer(Cmd_Get_Lens_Mode, error_msg);
  1124.  
  1125.     switch(r) {
  1126.         case Macro_Lens_Mode:
  1127.         case Normal_Lens_Mode:
  1128.         case Infinity_Fisheye_Lens_Mode:
  1129.             *lm=(Lens_Mode) r;
  1130.             break;
  1131.         
  1132.         default:
  1133.             *lm=Unknown_Lens_Mode;
  1134.             break;
  1135.     }
  1136. }
  1137.  
  1138. void Get_LCD_Brightness(int *lb, char* error_msg) {
  1139.     L4 r;
  1140.     int retries=0;
  1141.     
  1142.     MACRO_Get_FI_Integer(Cmd_Get_LCD_Brightness, error_msg);
  1143.     *lb=(int) r;
  1144. }
  1145.  
  1146.  
  1147. void Get_LCD_Autoshut_Timer(int *lat, char* error_msg) {
  1148.     L4 r;
  1149.     int retries=0;
  1150.     
  1151.     MACRO_Get_FI_Integer(Cmd_Get_LCD_Autoshut_Timer, error_msg);
  1152.     *lat=(int) r;
  1153. }
  1154.  
  1155.  
  1156. void Get_Protect_State_of_Frame(int framenumber, int *psof, char* error_msg) {
  1157.     L4 r;
  1158.     int retries=0;
  1159.     get_preview=0;
  1160.     
  1161.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Protect_State_of_Current_Frame, error_msg);
  1162.     *psof=(int) r;
  1163. }
  1164.  
  1165.  
  1166. void Get_Date_Format(enum Date_Format *df, char* error_msg) {
  1167.     L4 r;
  1168.     int retries=0;
  1169.     
  1170.     MACRO_Get_FI_Integer(Cmd_Get_Date_Format, error_msg);
  1171.  
  1172.     switch(r) {
  1173.         case YY_MM_DD_Date_Format:
  1174.         case DD_MM_HH_Date_Format:
  1175.             *df=(Date_Format) r;
  1176.             break;
  1177.         
  1178.         default:
  1179.             *df=Unknown_Date_Format;
  1180.             break;
  1181.     }
  1182. }
  1183.  
  1184.  
  1185. void Get_Exp_Meter(enum Exp_Meter *em, char* error_msg) {
  1186.     L4 r;
  1187.     int retries=0;
  1188.     
  1189.     MACRO_Get_FI_Integer(Cmd_Get_Exp_Meter, error_msg);
  1190.  
  1191.     switch(r) {
  1192.         case Center_weighted_Exp_Meter:
  1193.         case Spot_Exp_Meter:
  1194.         case Multi_Element_Matrix_Exp_Meter:
  1195.             *em=(Exp_Meter) r;
  1196.             break;
  1197.         
  1198.         default:
  1199.             *em=Unknown_Exp_Meter;
  1200.             break;
  1201.     }
  1202. }
  1203.  
  1204.  
  1205. void Get_Optical_Mode(int *AEL_WBL, int *Fisheye, int *Wide, int *Digital_Zoom, int *BAW, char* error_msg) {
  1206.     L4 r;
  1207.     int retries=0;
  1208.     
  1209.     MACRO_Get_FI_Integer(Cmd_Get_Optical_Mode, error_msg);
  1210.     
  1211.     *AEL_WBL=(r & 0x1);
  1212.     *Fisheye=(r & 0x2);
  1213.     *Wide=(r & 0x4);
  1214.     *Digital_Zoom=(r & 0x8);
  1215.     *BAW=(r & 0x10);
  1216. }
  1217.  
  1218.  
  1219. void Get_Frame(int framenumber, UBYTE *buffer, long *size, char* error_msg) {
  1220.     int retries=0;
  1221.     get_preview=0;
  1222.     
  1223.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Frame, buffer, size, error_msg);
  1224. }
  1225.  
  1226.  
  1227. void Get_Thumbnail(int framenumber, UBYTE *buffer, long *size, char* error_msg)  {
  1228.     int retries=0;
  1229.     get_preview=0;
  1230.     
  1231.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Thumbnail, buffer, size, error_msg);
  1232. }
  1233.  
  1234.  
  1235. void Get_Camera_ID(UBYTE *buffer, long *size, char* error_msg) {
  1236.     int retries=0;
  1237.         
  1238.     MACRO_Get_FI_VData(Cmd_Get_Camera_ID, buffer, size, error_msg);
  1239. }
  1240.  
  1241.  
  1242. void Get_Serial_Number(UBYTE *buffer, long *size, char* error_msg) {
  1243.     int retries=0;
  1244.     
  1245.     MACRO_Get_FI_VData(Cmd_Get_Serial_Number, buffer, size, error_msg);
  1246. }
  1247.  
  1248.  
  1249. void Get_Version(UBYTE *buffer, long *size, char* error_msg) {
  1250.     int retries=0;
  1251.     
  1252.     MACRO_Get_FI_VData(Cmd_Get_Version, buffer, size, error_msg);
  1253. }
  1254.  
  1255.  
  1256. void Get_Model(char *string, long *size, char* error_msg) {
  1257.     int retries=0;
  1258.     
  1259.     MACRO_Get_FI_VData(Cmd_Get_Model, string, size, error_msg);
  1260. }
  1261.  
  1262.  
  1263. /* not supported by many cameras */
  1264. void Get_Audio_Data(UBYTE *buffer, long *size, char* error_msg) {
  1265.     int retries=0;
  1266.  
  1267.     MACRO_Get_FI_VData(Cmd_Get_Audio_Data, buffer, size, error_msg);
  1268. }
  1269.  
  1270.  
  1271. void Get_Camera_Summery_Data(enum Resolution *re, int *LCD_Brightness, int *Frames_Taken, char* error_msg) {
  1272.     int retries=0;
  1273.     L4 buffer[8];
  1274.     long *size=NULL;
  1275.         
  1276.     MACRO_Get_FI_VData(Cmd_Get_Camera_Summery_Data, buffer, size, error_msg);
  1277.  
  1278.     *re=(Resolution)SetL4(buffer[0]);
  1279.     *LCD_Brightness=(int)SetL4(buffer[1]);
  1280.     *Frames_Taken=(int) SetL4(buffer[2]);
  1281. }
  1282.  
  1283.  
  1284. void Get_Picture_Summery_Data(int framenumber, long *AudioDataLength, enum Resolution *re, int *ProtectionState, time_t *TimeDate, char* error_msg) {
  1285.     int retries=0;
  1286.     L4 buffer[8];
  1287.     long *size=NULL;
  1288.     get_preview=0;
  1289.     
  1290.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Picture_Summery_Data, buffer, size, error_msg);
  1291.     if (*error_msg!=0) return;
  1292.  
  1293.     if ((*size)!=32) {
  1294.         strcpy(error_msg, "wrong size of data packet");
  1295.         return;
  1296.     }
  1297.     *AudioDataLength=(long)SetL4(buffer[2]);
  1298.  
  1299.     switch(SetL4(buffer[3])) {
  1300.         case Standard_Resolution:
  1301.         case High_Resolution:
  1302.         case Extended_Resolution:
  1303.             *re=(Resolution)SetL4(buffer[3]);
  1304.             break;
  1305.     
  1306.         default:
  1307.             *re=Unknown_Resolution;
  1308.             break;
  1309.     }
  1310.  
  1311.     *ProtectionState=(int) SetL4(buffer[4]);
  1312.     *TimeDate=(time_t) SetL4(buffer[5]);
  1313.  
  1314. }
  1315.  
  1316.  
  1317. void Get_Manufacturer(char *string, long *size, char* error_msg) {
  1318.     int retries=0;
  1319.     
  1320.     MACRO_Get_FI_VData(Cmd_Get_Manufacturer, string, size, error_msg);
  1321. }
  1322.  
  1323.  
  1324. void Get_Preview(UBYTE *buffer, long *size, char* error_msg)  {
  1325.     
  1326.     
  1327.     TakeAction(AC_Take_Preview_Snapshot, 0, error_msg);
  1328.     if (*error_msg!=0) {
  1329.         printf("%s\n", error_msg);
  1330.         strcpy(error_msg, "An error occured in TakeAction(AC_Take_Preview_Snapshot, 0);");
  1331.         return;
  1332.     }
  1333.     
  1334.     if (get_preview==0) {
  1335.     
  1336.         SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0, error_msg);
  1337.         if (*error_msg!=0) {
  1338.             printf("%s\n", error_msg);
  1339.             strcpy(error_msg, "An error occured in SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0);");
  1340.             return;
  1341.         }
  1342.     }
  1343.     
  1344.     get_preview=1;
  1345.     
  1346.     ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, (L4 *) size, error_msg);
  1347.     if (*error_msg!=0) {
  1348.         printf("%s\n", error_msg);
  1349.         strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
  1350.     }
  1351.     return;
  1352. }
  1353.  
  1354.  
  1355. char* dump_Resolution(enum Resolution r) {
  1356.     switch (r) {
  1357.         case Standard_Resolution:
  1358.             return "Standard";
  1359.         
  1360.         case High_Resolution:
  1361.             return "High";
  1362.         
  1363.         case Extended_Resolution:
  1364.             return "Extended";
  1365.         
  1366.         default:
  1367.             return "Unknown";
  1368.     }
  1369. }
  1370.  
  1371.  
  1372. char* dump_Aperture(enum Aperture a) {
  1373.     switch(a) {
  1374.         case Low_Aperture:
  1375.             return "Low";
  1376.         
  1377.         case Midium_Aperture:
  1378.             return "Midium";
  1379.         
  1380.         case High_Aperture:
  1381.             return "High";
  1382.         
  1383.         default:
  1384.             return "Unknown";
  1385.     }
  1386. }
  1387.  
  1388.  
  1389. char* dump_Color_Mode(enum Color_Mode cm) {
  1390.     switch(cm) {
  1391.         case Color_Color_Mode:
  1392.             return "Color";
  1393.         
  1394.         case BAW_Color_Mode:
  1395.             return "B&W";
  1396.         
  1397.         default:
  1398.             return "Unknown";
  1399.     }
  1400. }
  1401.  
  1402.  
  1403. char* dump_Flash_Mode(enum Flash_Mode fm) {
  1404.     switch(fm) {
  1405.         case Auto_Flash_Mode:
  1406.             return "Auto";
  1407.         
  1408.         case Force_Flash_Mode:
  1409.             return "Force";
  1410.             
  1411.         case Off_Flash_Mode:
  1412.             return "Off";
  1413.         
  1414.         case Anti_Red_Eye_Flash_Mode:
  1415.             return "Anti_Red_Eye";
  1416.         
  1417.         case Slow_Sync_Flash_Mode:
  1418.             return "Slow_Sync";
  1419.             
  1420.         default:
  1421.             return "Unknown";
  1422.     }
  1423. }    
  1424.  
  1425.  
  1426. char* dump_Camera_Speed(enum Camera_Speed cs) {
  1427.     switch (cs) {
  1428.         case CAMERA_SPEED_INIT:
  1429.             return "init-speed (=19200)";
  1430.         
  1431.         case CAMERA_SPEED_9600:
  1432.             return "9600";
  1433.             
  1434.         case CAMERA_SPEED_19200:
  1435.             return "19200";
  1436.         
  1437.         case CAMERA_SPEED_38400:
  1438.             return "38400";
  1439.         
  1440.         case CAMERA_SPEED_57600:
  1441.             return "57600";
  1442.         
  1443.         case CAMERA_SPEED_115200:
  1444.             return "115200";
  1445.             
  1446.         default:
  1447.             return "Unknown";
  1448.     }
  1449. }
  1450.  
  1451.  
  1452. char* dump_Bright_Contrast(enum Bright_Contrast bc) {
  1453.     switch (bc) {
  1454.         case Normal_Bright_Contrast:
  1455.             return "Normal_Bright";
  1456.         
  1457.         case More_Bright_Bright_Contrast:
  1458.             return "More_Bright";
  1459.         
  1460.         case Less_Bright_Bright_Contrast:
  1461.             return "Less_Bright";
  1462.             
  1463.         case More_Contrast_Bright_Contrast:
  1464.             return "More_Contrast";
  1465.         
  1466.         case Less_Contrast_Bright_Contrast:
  1467.             return "Less_Contrast";
  1468.             
  1469.         default:
  1470.             return "Unknown";
  1471.     }
  1472. }
  1473.  
  1474.  
  1475. char* dump_White_Balance(enum White_Balance wb) {
  1476.     switch (wb) {
  1477.         case Auto_White_Balance:
  1478.             return "Auto";
  1479.         
  1480.         case Skylight_White_Balance:
  1481.             return "Skylight";
  1482.         
  1483.         case Fluoresent_White_Balance:
  1484.             return "Fluoresent";
  1485.         
  1486.         case Thungsten_White_Balance:
  1487.             return "Thungsten";
  1488.         
  1489.         case Cloudy_White_Balance:
  1490.             return "Cloudy";
  1491.         
  1492.         default:
  1493.             return "Unknown";
  1494.     }
  1495. }
  1496.  
  1497.  
  1498. char* dump_Lens_Mode(enum Lens_Mode lm) {
  1499.     switch (lm) {
  1500.         case Macro_Lens_Mode:
  1501.             return "Macro";
  1502.         
  1503.         case Normal_Lens_Mode:
  1504.             return "Normal";
  1505.         
  1506.         case Infinity_Fisheye_Lens_Mode:
  1507.             return "Infinity_Fisheye";
  1508.         
  1509.         default:
  1510.             return "Unknown";
  1511.     }
  1512. }
  1513.  
  1514.  
  1515. char* dump_Date_Format(enum Date_Format df) {
  1516.     switch (df) {
  1517.         case YY_MM_DD_Date_Format:
  1518.             return "YY MM DD";
  1519.  
  1520.         case DD_MM_HH_Date_Format:
  1521.             return "DD MM HH";
  1522.         
  1523.         default:
  1524.             return "Unknown";
  1525.     }
  1526. }
  1527.  
  1528.  
  1529. char* dump_Exp_Meter(enum Exp_Meter em) {
  1530.     switch (em) {
  1531.         case Center_weighted_Exp_Meter:
  1532.             return "Center_weighted";
  1533.         
  1534.         case Spot_Exp_Meter:
  1535.             return "Spot";
  1536.         
  1537.         case Multi_Element_Matrix_Exp_Meter:
  1538.             return "Multi_Element_Matrix";
  1539.         
  1540.         default:
  1541.             return "Unknown";
  1542.     }
  1543. }
  1544.  
  1545.  
  1546. char* dump_LED_Mode(enum LED_Mode lm) {
  1547.     switch (lm) {
  1548.         case Off_LED_Mode:
  1549.             return "Off";
  1550.         
  1551.         case On_LED_Mode:
  1552.             return "On";
  1553.         
  1554.         case Blink_LED_Mode:
  1555.             return "Blink";
  1556.         
  1557.         default:
  1558.             return "Unknown";
  1559.     }
  1560. }
  1561.